package actions;

import gui.MainFrame;
import gui.view.GroupableTableColumnModel;
import gui.view.GroupableTableHeader;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collections;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import tablemodels.EstimationModel;
import utils.ColumnGroup;
import utils.Expert;
import utils.Risk;
import utils.SimpleColumn;

/**
 * 
 * @author dernasherbrezon
 *
 */
public class RiskEstimation extends WizardStep
{
	JPanel centerPanel = new JPanel();
	
	ArrayList<EstimationModel> data = new ArrayList<EstimationModel>(); 
	MainFrame parent;
	
	public RiskEstimation(MainFrame parent)
	{
		this.parent = parent;
		BoxLayout bl = new BoxLayout(centerPanel,BoxLayout.Y_AXIS);
		centerPanel.setLayout(bl);
		setLayout(new BorderLayout());
	}
	
	@Override
	public void checkInputValues() throws Exception
	{
		for(int i=0;i<data.size();i++)
		{
			data.get(i).checkCorrectValues();
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void makeActions()
	{
		int [][]allRisks = new int[parent.risks.size()][parent.experts.size()];
		for(int k=0;k<parent.experts.size();k++)
		{
			ArrayList<Float> rank = new ArrayList<Float>(); 
			//float []rank = new float[parent.risks.size()];
			for(int i=0;i<parent.risks.size();i++)
			{
				float tempValue = 0.0f;
				for(int j=0;j<parent.riskCriterions.size();j++)
				{
					tempValue += (float)(Integer)data.get(k).getValueAt(i,j)*parent.riskCriterions.get(j).weight;
				}
				rank.add(tempValue);
			}
			ArrayList<Float> sortedRanks = (ArrayList<Float>)rank.clone();
			Collections.sort(sortedRanks);
			for(int i=0;i<parent.risks.size();i++)
			{
				allRisks[i][k] = rank.indexOf(sortedRanks.get(i));
			}
		}
		
		ArrayList<Float> vspomRank = new ArrayList<Float>();
		for(int i=0;i<parent.risks.size();i++)
		{
			float tempSumm = 0.0f;
			for(int j=0;j<parent.experts.size();j++)
			{
				tempSumm += (float)allRisks[i][j]*parent.experts.get(j).weight;
			}
			vspomRank.add(tempSumm);
		}
		ArrayList<Float> sortedRanks = (ArrayList<Float>)vspomRank.clone();
		Collections.sort(sortedRanks);
		
		ArrayList<Risk> newRisks = new ArrayList<Risk>();
		for(int i=0;i<parent.risks.size();i++)
		{
			int index = vspomRank.indexOf(sortedRanks.get(i));
			newRisks.add(parent.risks.get(index));
		}
		
		parent.result = newRisks;
	}

	@Override
	public void loadStep()
	{
		centerPanel.removeAll();
		removeAll();
		
		for(int i=0;i<parent.experts.size();i++)
		{
			createTableForExpert(parent.experts.get(i));
		}
		add(centerPanel,BorderLayout.CENTER);
		
		JPanel right = new JPanel();
		BoxLayout bl = new BoxLayout(right,BoxLayout.Y_AXIS);
		right.setLayout(bl);
		right.add(Box.createVerticalGlue());
		right.add(new JButton(new AbstractAction("Печать") //TODO печатать бланк или распечатать таблицу для каждого -тогда потом диалог нужно вызывать таблицу чьего автора печатать
		{
			public void actionPerformed(ActionEvent arg0)
			{
				JOptionPane.showMessageDialog(null,"Not yet impelemented","Ошибка!",JOptionPane.ERROR_MESSAGE);
			}
		}));
		add(right,BorderLayout.EAST);
	}
	
	@Override
	public void preShow()
	{
	}

	private void createTableForExpert(Expert expert)
	{
		centerPanel.add(new JLabel("Оценка рисков по критериям для эксперта: "+expert.name));
		EstimationModel model = new EstimationModel(parent);
		data.add(model);
		
        GroupableTableColumnModel cm = new GroupableTableColumnModel();
        
        for(int i=0;i<model.getColumnCount();i++)
        {
            SimpleColumn Column0 = new SimpleColumn(i,model.getColumnName(i));
            cm.addColumn(Column0);
        }
        
        ColumnGroup crit = new ColumnGroup("Критерии");
        for(int i=0;i<parent.riskCriterions.size();i++)
        {
        	crit.add(cm.getColumn(2+i));
        }
        cm.addColumnGroup(crit);
        
        JTable table = new JTable(model);
        table.setAutoCreateColumnsFromModel(false);
        table.setColumnModel(cm);
        table.setTableHeader(new GroupableTableHeader(cm));
        
        JScrollPane sp = new JScrollPane(table);
        centerPanel.add(sp);		
	}
}
